package com.test.designmode.single;

/**
 * 双检锁/双重校验锁（DCL，即 double-checked locking）
 * JDK 版本：JDK1.5 起
 * <p>
 * 是否 Lazy 初始化：是
 * <p>
 * 是否多线程安全：是
 * <p>
 * 实现难度：较复杂
 * <p>
 * 描述：这种方式采用双锁机制，安全且在多线程情况下能保持高性能。
 * getInstance() 的性能对应用程序很关键
 */
public class SingleLazyDcl {

    //volatile 英 [ˈvɒlətaɪl] 英译汉-不稳定的，java中意思是共享的

    //volatile变量，用来确保将变量的更新操作通知到其他线程。
    // 当把变量声明为volatile类型后，编译器与运行时都会注意到这个变量是共享的，
    // 因此不会将该变量上的操作与其他内存操作一起重排序。
    // volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方，
    // 因此在读取volatile类型的变量时总会返回最新写入的值

    //1.声明一个静态的（共享的）成员变量
    private volatile static SingleLazyDcl singleton;
    //2.私有默认构造方法
    private SingleLazyDcl() {
    }
    //3.静态get方法
    public static SingleLazyDcl getSingleton() {
        //双锁机制，判空+synchronized同步锁
        if (singleton == null) {
            synchronized (SingleLazyDcl.class) {
                if (singleton == null) {
                    singleton = new SingleLazyDcl();
                }
            }
        }
        return singleton;
    }

}
